package com.strong.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.strong.FakerConstants;
import com.strong.enum_.ProvinceEnum;
import com.strong.model.Place;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import static com.strong.enum_.ProvinceEnum.LIST_ALL_PROVINCE_ENUMS;

/**
 * 模拟数据 工具类
 *
 * @author Administrator
 * @date 2023/04/08
 */
public class FakerUtils {

    /**
     * 注入项目
     *
     * @param strFile str文件
     */
    public static <M> void injectList(List<M> list, String strFile, Class<M> classType) {
        // 从资源文件读取内容
        String strContent = ResourceUtil.readUtf8Str(strFile);
        String[] strsContent = strContent.split("\n");

        for (String strLine : strsContent) {
            if (StrUtil.isNotBlank(strLine)) {
                String[] strsItem = strLine.split(",");
                // 对所有元素进行trim处理
                for (int i = 0; i < strsItem.length; i++) {
                    strsItem[i] = strsItem[i].trim();
                }
                // 反射实例化对象
                list.add(ReflectUtil.newInstance(classType, (Object[]) strsItem));
            }
        }
    }

    /**
     * 根据地址编码数据，获取对应的地址对象队列
     *
     * @param strsCode str代码
     * @return {@link List}<{@link Place}>
     */
    public static List<Place> getPlaceList(String[] strsCode) {
        List<Place> list = new ArrayList<>();
        Assert.isTrue(ArrayUtil.isNotEmpty(strsCode), "地址编码为空");
        Assert.isTrue(CollUtil.isNotEmpty(FakerConstants.LIST_ALL_PLACE), "基础数据未初始化，需先执行Faker.initialize()");
        // 遍历输入的编码数组
        for (String strCode : strsCode) {
            for (Place place : FakerConstants.LIST_ALL_PLACE) {
                // 如果地址编码与 省市县区街道等编码匹配，则加入该地址对象
                if (StrUtil.equalsAny(strCode,
                        place.getProvinceCode(), place.getCityCode(),
                        place.getCountyCode(), place.getStreetCode())) {
                    list.add(place);
                }
            }
        }
        return list;
    }

    /**
     * 断言对象所有字段非空
     *
     * @param model 模型
     */
    public static <M> void assertObjectFieldNotNull(M model) {
        if (model instanceof String) {
            Assert.notNull(model, "对象为空");
            return;
        }
        // 使用反射遍历获取所有属性值，断言所有非空
        Field[] fields = ReflectUtil.getFields(model.getClass());
        for (Field field : fields) {
            Assert.notNull(ReflectUtil.getFieldValue(model, field), "[{}]字段为空", field);
        }
    }

    /**
     * 获取随机省枚举数组
     * <p>
     * 限制最大数量intMaxCount，intMaxCount越界时使用LIST_PROVINCE_ENUMS数量最大值
     *
     * @param intMaxCount 最大数量
     * @return {@link ProvinceEnum[]}
     */
    public static ProvinceEnum[] randomProvinceEnums(int intMaxCount) {
        // 如果数量大于所有枚举数量
        if (intMaxCount > LIST_ALL_PROVINCE_ENUMS.size() + 1 || intMaxCount <= 0) {
            intMaxCount = LIST_ALL_PROVINCE_ENUMS.size();
        }
        return RandomUtil.randomEles(LIST_ALL_PROVINCE_ENUMS, RandomUtil.randomInt(1, intMaxCount)).toArray(ProvinceEnum[]::new);
    }

    /**
     * 获取随机省枚举数组，不限制数量
     *
     * @return {@link ProvinceEnum[]}
     */
    public static ProvinceEnum[] randomProvinceEnums() {
        return randomProvinceEnums(0);
    }

    public static void main(String[] args) {
//        ProvinceEnum[] provinceEnums = randomProvinceEnums();
//        Arrays.stream(provinceEnums).toa;
    }
}
